package _map

import (
	"fmt"
	"maps"
)

/** map类型
map 是在 Go 中将键（key）与值（value） 关联的内置类型。通过相应的键可以获取到值。 */

// 示例1
func case1() {
	// 创建map 方式1
	var m1 map[string]int
	if m1 == nil {
		fmt.Println("m1 是空 is nil")
		m1 = make(map[string]int) // 声明
	}
	// 添加元素
	m1["a"] = 1
	m1["b"] = 2
	m1["c"] = 3
	fmt.Printf("m1 元素有 %v \n", m1)

	// 删除元素
	delete(m1, "a")
	fmt.Printf("删除元素后 m1 元素有 %v \n", m1)

	// 获取map 长度
	fmt.Printf("获取m1 的长度 %v \n", len(m1))

	// 创建map 方式2
	m2 := map[string]int{
		"tom": 18,
		"JIE": 22,
	} //声明+初始化
	m2["JIE"] = 99 //修改JIE的年龄
	fmt.Printf("m2 元素有 %v \n", m2)

	// 获取map 中的元素
	personSalary := map[string]int{"steve": 12000, "jamie": 15000}
	fmt.Println("取map key=jamie 的val =", personSalary["jamie"])
	fmt.Println("🔥取在map中没有的元素会返回0 val的类型是int", personSalary["aaa"])

	// 如何判断map中的key是否存在
	v, ok := personSalary["steve"]
	if ok == true {
		fmt.Printf("map中的key存在，并获取值=%d \n", v)
	} else {
		fmt.Println("map中不存在这个key")
	}

	// 遍历map
	for k, v := range personSalary {
		fmt.Printf("k=%s, v=%d \n", k, v)
	}

	// map是引用类型
	m3 := map[int]string{1: "a", 2: "b", 3: "c"}
	m3[1] = "aa"
	fmt.Println(m3)
	m4 := m3     //将m3 赋值给 m4
	m4[2] = "bb" //修改m4 会发现m3也会变,原因m4的引用地址指向m4
	fmt.Println(m4)
	fmt.Println(m3)

	// map的相等，只能用循环来判断比较元素是否相同实现！！！
	// Go 1.21+ 提供的官方比较方法
	if maps.Equal(m3, m4) {
		fmt.Println("map 相等...")
	}

}

func Test() {

	case1()
}
